/**
 * $Revision$
 * $Date$
 *
 * Copyright 2003-2007 Jive Software.
 *
 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jivesoftware.smackx.workgroup.ext.notes;

import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.IQProvider;
import org.xmlpull.v1.XmlPullParser;

/**
 * IQ packet for retrieving and adding Chat Notes.
 */
public class ChatNotes extends IQ {

	/**
	 * Element name of the packet extension.
	 */
	public static final String ELEMENT_NAME = "chat-notes";

	/**
	 * Namespace of the packet extension.
	 */
	public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";

	private String sessionID;
	private String notes;

	public String getSessionID() {
		return sessionID;
	}

	public void setSessionID(String sessionID) {
		this.sessionID = sessionID;
	}

	public String getNotes() {
		return notes;
	}

	public void setNotes(String notes) {
		this.notes = notes;
	}

	public String getChildElementXML() {
		StringBuilder buf = new StringBuilder();

		buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"")
				.append(NAMESPACE).append("\">");
		buf.append("<sessionID>").append(getSessionID()).append("</sessionID>");

		if (getNotes() != null) {
			buf.append("<notes>").append(getNotes()).append("</notes>");
		}
		buf.append("</").append(ELEMENT_NAME).append("> ");

		return buf.toString();
	}

	/**
	 * An IQProvider for ChatNotes packets.
	 * 
	 * @author Derek DeMoro
	 */
	public static class Provider implements IQProvider {

		public Provider() {
			super();
		}

		public IQ parseIQ(XmlPullParser parser) throws Exception {
			ChatNotes chatNotes = new ChatNotes();

			boolean done = false;
			while (!done) {
				int eventType = parser.next();
				if (eventType == XmlPullParser.START_TAG) {
					if (parser.getName().equals("sessionID")) {
						chatNotes.setSessionID(parser.nextText());
					} else if (parser.getName().equals("text")) {
						String note = parser.nextText();
						note = note.replaceAll("\\\\n", "\n");
						chatNotes.setNotes(note);
					}
				} else if (eventType == XmlPullParser.END_TAG) {
					if (parser.getName().equals(ELEMENT_NAME)) {
						done = true;
					}
				}
			}

			return chatNotes;
		}
	}

	/**
	 * Replaces all instances of oldString with newString in string.
	 * 
	 * @param string
	 *            the String to search to perform replacements on
	 * @param oldString
	 *            the String that should be replaced by newString
	 * @param newString
	 *            the String that will replace all instances of oldString
	 * @return a String will all instances of oldString replaced by newString
	 */
	public static final String replace(String string, String oldString,
			String newString) {
		if (string == null) {
			return null;
		}
		// If the newString is null or zero length, just return the string since
		// there's nothing
		// to replace.
		if (newString == null) {
			return string;
		}
		int i = 0;
		// Make sure that oldString appears at least once before doing any
		// processing.
		if ((i = string.indexOf(oldString, i)) >= 0) {
			// Use char []'s, as they are more efficient to deal with.
			char[] string2 = string.toCharArray();
			char[] newString2 = newString.toCharArray();
			int oLength = oldString.length();
			StringBuilder buf = new StringBuilder(string2.length);
			buf.append(string2, 0, i).append(newString2);
			i += oLength;
			int j = i;
			// Replace all remaining instances of oldString with newString.
			while ((i = string.indexOf(oldString, i)) > 0) {
				buf.append(string2, j, i - j).append(newString2);
				i += oLength;
				j = i;
			}
			buf.append(string2, j, string2.length - j);
			return buf.toString();
		}
		return string;
	}
}
